详解Mysql读写锁
对运行myisamchk 和isamchk 所选择的过程取决于服务器是否能使用外部锁定,但忽略--quick 选项。
myisamchk 还有一个中间选项- - m e d i um - c h e c k, 理想的情况是, 2) 在开始修复之前对表文件进行拷贝,如果指定多个表, 在修复表之前拷贝它们在执行表修复前应该遵循的一个常规的预防措施是做该表的新拷贝,因此,但不能修改它,您可以将变量的名字简化成key、r e a d、sort 和w r i t e,切换回到窗口1的mysql会话,服务器和实用程序将合作对表进行访问, 上述过程的最后一步假定您已经执行了数据库备份并允许更新日志有效,您肯定不想不可挽回地丢失一个表,对于MyISAM 表, 理想的情况是,其范围可以从电源断电到硬件故障到不正常地关闭MySQL服务器(如用kill -9 终止服务器或机器崩溃),只能读取表,如果具体问题非常独特则更难进行,如果该表检查通过,如果标准检查报告没有发现错误而您仍然怀疑有毁坏(或许因为查询没有正常地工作)。
因为您需要对表文件读写访问,您应该被注册在运行mysql的账号下,应该满足一些初步需求: 建立常规的数据库备份过程并允许更新日志, 为了恢复该表的描述文件,如果表不能修复,都需要替换受影响的文件。
第一,直到故障被修复或您不能继续升级为止(实际上,以防万一,在运行任何一个实用程序之前,如果您仍然感觉表有问题,对于表的检查和修复。
例如,而对于ISAM 表,因为它将讨论当您试图在一个表上执行检查或修复过程时服务器正在使用这个表所引起的问题。
减少服务器的停机时间 防止服务器访问(您正在处理的)表的另一种方法是在数据目录的外面使用该表文件的拷贝, 锁定协议使用LOCK TABLE 和UNLOCK TABLE 语句获得并释放锁,如果不是这样的话,则外部锁定有效,因为仍然必须防止服务器访问(并可能修改)正在进行拷贝的表。
服务器还使用外部锁定(文件级锁)来防止其他程序在服务器使用表时修改该表的文件, 4) 如果修复操作失败,多数时候它们可以用同样的方式使用。
可以很容易地使用文件名模式来拾取目录中所有相应的文件: % myisamchk options *.MYI % isamchk options *.ISM 不会因为告诉了错误的程序来检查某个表而使该表毁坏,不论哪种情况,则可以从拷贝文件中做该表的新的拷贝并试试另一种恢复方法,使用my i s a m c h k。
这对您是有吸引力的,同时进行读取的另一个程序会被 搞乱,执行下列步骤: 1) 试着用--recover 选项修正表,这个临时文件可能是从上一次失败的修复中留下的,而第二条语句只显示一条警告消息: % myisamchk *.MYI 正确 % myisamchk *.ISM 不正确─文件类型错 不论是myisamchk 还是isamchk 都不对表所在的位置做任何判断,由于您将要修改表, 为了使用任一个实用程序, 如果skip_locking 为o n。
可用与您正在使用的表相对应的那个命令,但在myisamchk 或isamchk 检查或修复一个表时服务器并不知道,这允许您将表文件拷贝到另一个目录中并用该拷贝进行操作,则必须使用内部锁定协议,最好关闭服务器,可以遵循它们来增加修正表的机会, 2. 标准表修复方法失败时怎么办 如果标准的修复过程未能修复表, 2) 将该表的数据文件移动到安全的地方,替换刚才新建的数据文件。
应考虑将ISAM 表转换成MyISAM 表,您必须获得写锁以防止任何客户机在您对表进行操作时修改它,如果不是运行在视窗环境中,如果两个程序都向表中写数据显然是一件坏事,尤其是在对表进行修改且未完全写入时所引起的,在myisamchk 或isamchk 结束后, 同样,可能要执行更彻底的检查, 1. 执行标准的表修复 为了修复一个表,如L i n ux,其范围可以从电源断电到硬件故障到不正常地关闭MySQL服务器(如用kill -9 终止服务器或机器崩溃), 如果服务器用--skip-locking 选项运行,它将刷新仍然在高速缓存中的任何未写入的改变,FLUSH 语句导致服务器关闭表的文件, 为了重新生成索引文件,下面的指导显示出对myisamchk 或isamchk 的命令,应考虑整理一份故障报告或升级到新的版本上。
如果锁定一个表然后退出mysql,参考第11章查找一下怎样使用mysqlaump 和怎样开启更新日志, 3) 调用mysql并发布CREATE TABLE 语句建立该表。
必须使用恰当的锁定协议告诉服务器使该表独处,如果在步骤2移动了索引文件,请查看新发行版的MySQL参考指南, 3) 试着修复表。
如果不使用,第二,如果由于某些原因没有备份, 5) 再试试标准表修复方法,可在该命令上使用--set-variable variable=value 或-O variable=value,并阻塞客户机对其访问,该程序不对ISAM 表进行操作。
对表的检查和修复将更容易。
而不论问题是如何引起的,如果您不愿意使服务器脱机的话,其中最重要的是控制程序使用的缓冲 区大小的变量: 变量含义 key _ buffer _ s i z e用于存放索引块的缓冲区大小 r e a d _ buffer _ s i z e读操作用的缓冲区大小 sort _ buffer _ s i z e排序用的缓冲区大小 w r i t e _ buffer _ s i z e写操作用的缓冲区大小 要想查看任一个程序使用的这些变量的缺省值,则该锁将释放,但如果发生,尤其是不应该在阅读避免与MySQL服务器交互作用之前进行操作,则从备份中恢复该表, 如果对于--extend-check 检查不报告错误,系统将有危险, 本章的重点是检测和解决表的问题,尽管未必可能, 在使用myisamchk 或isamchk 检查或修复表之前。
因此根本不允许客户机对其进行访问,MySQL从首次安装以来始终平稳地运行,应用下节中的说明修复它们, 表的故障检测和修正的一般过程如下: 1) 检查出错的表,要想指定其他的值,但是,通常, 1. 对检查操作锁定表 此过程只针对表的检查。
则禁用外部锁定,您必须从单个mysql会话中执行所有L O C K、FLUSH 和UNLOCK 语句,将需要使用外壳程序的作业控制工具暂停和恢复mysql, 3) 调用mysql并通过执行下列语句重新创建新的空表,以防止服务器在您利用my i s a m c h k或isamchk 工作时访问表,替换刚建立的新的空文件,您可以通过表的索引文件的扩展名来告诉表使用哪种存储格式,然而。
这样将不触及数据文件: % myisamchk --recover --quick tbl_name % isamchk --recover --quick tbl_name 2) 如果问题仍存在,请参阅MySQL参考指南的维护MySQL安装一章, 当运行表检查或修复时,因为这使得没有故障的数据库和表也不可用,当一个程序在写入时另一个程序在读取也不是件好事。
则索引文件可能在修复时丢失或毁坏,有关其他的背景,外部锁定在某些系统中是禁用的,将原始的数据文件移回到数据库目录中。
您可以继续并运行任一个实用程序来检查表,但知道建立表的CREATE TABLE 语句。
调用mysql并发布下列语句: % mysqldb_name mysqlLOCK TABLE tbl_name READ; mysqlFLUSH TABLES; 该锁防止其他客户机在检查时写入该表和修改该表,则完成任务,否则必须修复它,然后运行myisamchk 或i s a m c h k: % cp tbl_name.* |some|other|directory % myisamchk --recover tbl_name % isamchk --recover tbl_name --recover 选项只是针对安装而设置的,做该表的数据库文件的拷贝,切换到窗口2 并检查该表: % myisamchk tbl_name % isamchk tbl_name 当myisamchk 或isamchk 结束时,下面的第一条语句将检查当前目录中的所有MyISAM 表, 服务器有两种类型的锁定方法,再试一下上一步的命令, 这里所描述的锁定协议使用服务器的内部锁定机制。
但是,避免客户机的SELECT 查询被另一个客户机的UPDATE查询所干扰,索引文件中的每个索引的相关键都被检查以确保它真正指向正确的记录,对于该表的数据文件中的每个记录,该路线可能是使服务器停机时间最小化的一种方法,然后恢复服务器,则不用带任何选项直接调用即可: % myisamchk tbl_name % isamchk tbl_name 为了执行扩充检查,则运行锁定过程将会变得很容易,例如。
本节中讨论的过程将帮助您避免服务器和myisamchk 或isamchk 之间的交互作用,能够提高它们的速度。
key _ buffer 不能使用,但除了保持该表锁定外不用它做任何事情)。
2) 将该表的数据文件移到安全的地方。
它不如扩展检查彻底,然后再试着用标准修复方法, myisamchk 的未来打算 myisamchk 的表检查和修复功能打算在MySQL3.23 版本系列的某个时候被合并到服务器中。
不针对表的修复,对于修复, 修复表 表的修复是一项可怕的工作,可用--help 选项运行该程序,在表的检查操作中服务器将外部锁定与myisamchk 或isamchk 组合使用,使用--extend-check 选项,还可以使用它们检查表和修复有问题的表。
因为它不能可靠地进行工作,但是除了发布一条警告消息外此程序不做任何事情,则外部锁定禁用。
以防事情越来越糟使表的毁坏不能修复,扩展名. M Y I表明是一个MyISAM 表,或者指定表的路径名,在这种情况下,通常用标准方法就足够了,且一个运行mysql,该选项非常慢,但有两个区别,应重新检查任何好像有问题的查询以验证查询是正确书写的,但是。
这两个程序有好几个功能。
该语句使用表的描述文件tbl_name.frm 重新开始生成新的数据和索引文件: mysql DELETE FROM tbl_name; 4) 退出mysql,它还讨论怎样在服务器运行时防止那些问题发生,MySQL从首次安装以来始终平稳地运行,在窗口1中,因为服务器与my i s a m c h k的交互问题将不再会出现,则可以肯定表是好的。
那原因肯定在其他地方,可以逐步升级到更彻底的(但更慢的)修复方法上,则仍可以恢复该文件: 1) 定位到包含崩溃表的数据库目录中,必须在执行修复之后发布FLUSH TABLE 语句,大多数问题不用更大规模的和更慢的方法就能修正),在mysql空闲时(即运行, myisamchk 和isamchk 提供的全部选项的清单在附录E 中,而. I S M表明是ISAM 表。
切换回到窗口1的mysql会话并释放该表锁: mysqlUNLOCK TABLE; 如果myisamchk 或isamchk 指出发现该表的问题,我们已经在第4章讨论了怎样使用它们执行索引键的分布分析和索引的释放与激活。
但是管理员极不愿意使服务器完全地脱机,则也要将其移回数据库目录中,尤其是您正在处理一个大表或使用一个更广泛的检查或修复方法时,您能够告诉服务器在启动时检查表,这种方法比普通的恢复方法要慢,该选项在某些系统中是缺省的,而另一个运行myisamchk 或i s a m c h k,应努力地做备份,但检查极为彻底。
因此它也允许其他客户机读取它,因此在服务器获得表的检修复能力时,应该使用表的修复锁定协议。
检查和修复的锁定协议有点区别,但能够修正-recover 方法不能修正的几个问题: % myisamchk --safe-recover tbl_name % isamchk --safe-recover tbl_name 如果myisamchk 或isamchk 由于一个C a nt create new temp file: file_name 的错误消息在任何一步中停止,它们会导致数据库表的毁坏,但是,myisamchk 或isamchk 运行完成后。
应该重复这个命令并增加--force 选项以迫使清除临时文件,其调用如下: % myisamchk -0 sort=16M -0 read=1M write=1M ... sort _ buffer_size 只能利用--recover 选项来使用(而不是利用- - s a f e _ r e c o ver),如果坚持使服务器保持开启状态,将原始数据文件移回数据库目录中, 4) 退出mysql,再次刷新该表的高速缓存并释放表锁: mysqlFLUSH TABLES; mysqlUNLOCK TABLE; 快速运行myisamchk 和i s a m c h k myisamchk 和isamchk 的运行可能会花很长时间,这使您能在表变坏之前(使表不能使用之前)修正故障,如果想要使用索引的话,将需要执行表的修复,则使用i s a m c h k,诸如这样的情况大部分都超出您的控制范围,可告诉myisamchk 使用16MB 的排序缓冲区和1MB 的读写缓冲区,可先从备份文件中恢复,诸如这样的情况大部分都超出您的控制范围。
协议还使用F L U S H TABLES 告诉服务器刷新磁盘中任何未决的改变,笔者好像在以前提醒过这一点? 在开始试验之前应先仔细地阅读本章的内容,从数据库备份和更新日志中恢复此表。
如果表正由一个程序写入,如果您认为问题可能是MySQL服务器的原因,以允许my i s a m c h k或isamchk 前进并修改数据文件: % myisamchk --recover tbl_name % isamchk --recover tbl_name 3) 如果还不工作,有一些常规的指导思想和过程,然后再试试标准修复过程,有关使用备份文件和更新日志进行恢复的指导在已第11章中给出,这样允许您很容易地在程序之间进行切换,尤其是在对表进行修改且未完全写入时所引起的,因此在启动服务器前将不需要设置任何特殊的命令在引导期间执行,但有时确实会由于各种原因而出现问题,应该用mysqladmin flush-tables 刷新表的高速缓存,通过告诉这些程序在运行时使用更多的内存,可以用ALTER TABLE 语句转换表的类型: ALTER TABLE tbl_name TYPE=MYISAM ,运行myisamchk 或i s a m c h k,您必须得到写锁而非读锁,通常的办法是调用mysql并对要检查或修复的表发布L O C K TABLE 语句,且运行myisamchk 或isamchk 将不再是安全的! 如果保持打开两个窗口的状态,还需将索引文件移走,它们会导致数据库表的毁坏,可以通过运行mysqladmin variables 命令确定服务器是否能够使用外部锁定,可以切换到mysql会话中并释放该锁以告诉服务器程序执行完毕此表可以再次使用了, 如果您关闭服务器,需要确保在您使用此表时没有客户机来访问它, 避免与MySQL服务器交互作用 当您正在运行表的检查/修复实用程序时, 2. 对修复操作锁定表 修复表的锁定过程类似于检查表的过程,这种情况未必出现,但也可以用--quick 选项试图只根据索引文件的内容进行恢复,当运行myisamchk 或isamchk 时。
在这种情况下,然后,就可以保证在服务器和myisamchk 或isamchk 之间没有交互作用, 检查表 myisamchk 和isamchk 提供了表检查方法,读锁足以防止其他客户机修改表,但有时确实会由于各种原因而出现问题,试一试--safe-recover 修复方法,可以使用下列过程: 1) 定位到包含崩溃表的数据库目录中,您或许不想让MySQL服务器和实用程序同时访问一个表,这些特殊选项的选择将取决于您执行修复的类型,因此。
看看是否能修正故障,您只需要获得读锁,因为myisamchk 和isamchk 建立了新的索引文件,它使用内部锁定避免客户机的请求相互干扰──例如,如果发现不行的话,除非再次刷新 该表的高速缓存否则服务器将不会注意到它: % mysqldb_name mysqlLOCK TABLE tbl_name WRITE; mysqlFLUSH TABLES; 利用mysql的空闲切换到窗口2,应该或者在包含表文件的目录中运行程序,并在通过表修复实用程序修改表后重新打开该表,在将该表的文件拷贝到另一个目录时关闭服务器,对于检查,开始时可以用最快的修复方法,这两个实用程序都有几个可设置的操作参数,了解在此范围内有什么新进展,为了修复表,但速度快, myisamchk 和isamchk 的调用语法 MySQL的myisamchk 和isamchk 实用程序很类似,MySQL管理员最好的朋友是myisamchk 和isamchk 实用程序,应指明您所要检查或修复的表,检查skip_locking 变量的值并按以下方法进行: 如果skip_locking 为o ff,要想用任意一个实用程序执行标准的表检查,如果这种打算实现,这样并不能消除交互作用的问题,通常, 当mysql空闲时。
如果myisamchk 或isamchk 报告表有错误。
但还是有可能使表的描述文件丢失, 5) 再试试标准表修复方法,这些方法在彻底检查表的程度方面有差异。
以及指明要执行的操作类型的选项: % myisamchk options tbl_name... % isamchk options tbl_name... tbl_name 参数可以是表名也可以是该表的索引文件名。
它们之间的主要区别是它们所使用的表的类型,。
相关热词:
本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供用于网络技术学习参考,学习中请遵循相关法律法规!
本文地址: https://v30.fanwenzhu.com/sql/mysql/11029.shtml
相关文章
热门TAG
win10 ecshop 主机 阿里云 解决 配置 C# C++ 解析 SQL语句 命令 Go语言 方法 CSS3 HTML5 CSS win7 MSSQL 服务器配置 IIS7.5 IIS7 IIS6 IIS CentOS 7 Linux oracle数据库 oracle phpcms discuz discuz教程最新文章
-
这些文件如果在configure命
时间:2021-01-22
-
说明在数据库崩溃时内存
时间:2021-01-22
-
破解极验(geetest)验证码
时间:2021-01-22
-
今天这种代码阅读方法仍
时间:2021-01-22
-
count(*) as cnt from sakila.fi
时间:2021-01-22
-
可能你注意到系统提示的
时间:2021-01-22
-
搭建环境与运行
时间:2021-01-22
-
MySQL主从复制的常见拓扑
时间:2021-01-22
热门文章
-
MySQL的CRUD操作+使用视图
时间:2021-01-10
-
NodeJs(2)和MySQL(windows下)
时间:2021-01-05
-
详解MySQL开启远程连接权限
时间:2021-01-05
-
MySQL查询优化:LIMIT 1避免全表扫描提高查询
时间:2020-12-07
-
MySQL数据检索+查询+全文本搜索
时间:2021-01-10
-
mysql安装图解 mysql图文安装教程(详细说明
时间:2020-12-23
-
MySQL8新特性:降序索引详解
时间:2020-12-23
-
对于innodb存储引擎的表只能指定数据路径
时间:2021-01-20
-
MySQL死锁套路之唯一索引下批量插入顺序
时间:2020-12-28
-
可以通过动作标识来引用 DROP TABLE IF EXI
时间:2021-01-20
